﻿#region Copyright (c) 07/18/2012, Olaf Kober <amarok.projects@gmail.com>
//================================================================================
//	Permission is hereby granted, free of charge, to any person obtaining a copy
//	of this software and associated documentation files (the "Software"), to deal
//	in the Software without restriction, including without limitation the rights
//	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//	copies of the Software, and to permit persons to whom the Software is
//	furnished to do so, subject to the following conditions:
//
//	The above copyright notice and this permission notice shall be included in
//	all copies or substantial portions of the Software.
//
//	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//	THE SOFTWARE.
//================================================================================
#endregion

#if TESTS

using System;
using System.Collections.Generic;
using System.Windows;
using NUnit.Framework;


namespace Amarok.Presentation
{
	[TestFixture]
	public class Test_IndexToObjectConverter
	{
		[Test]
		public void Test_Convert_DefaultValues()
		{
			// :: Convert
			// 0..n          ...  Object at the Index position
			// Out-Of-Range  ...  DefaultValue

			var converter = new IndexToObjectConverter();

			Assert.That(converter.Values, Is.Not.Null);
			Assert.That(converter.Values, Is.Empty);
			Assert.That(converter.DefaultValue, Is.EqualTo(DependencyProperty.UnsetValue));
			Assert.That(converter.DefaultIndex, Is.EqualTo(DependencyProperty.UnsetValue));

			Assert.That(
				converter.Convert(-1, null, null, null),
				Is.EqualTo(DependencyProperty.UnsetValue));

			Assert.That(
				converter.Convert(0, null, null, null),
				Is.EqualTo(DependencyProperty.UnsetValue));

			Assert.That(
				converter.Convert(null, null, null, null),
				Is.EqualTo(null));

			Assert.That(
				converter.Convert("BLA", null, null, null),
				Is.EqualTo("BLA"));
		}

		[Test]
		public void Test_Convert_NullList()
		{
			// :: Convert
			// 0..n          ...  Object at the Index position
			// Out-Of-Range  ...  DefaultValue

			var converter = new IndexToObjectConverter()
			{
				Values = null,
				DefaultValue = "D",
				DefaultIndex = -1,
			};

			Assert.That(
				converter.Convert(-1, null, null, null),
				Is.EqualTo("D"));

			Assert.That(
				converter.Convert(0, null, null, null),
				Is.EqualTo("D"));

			Assert.That(
				converter.Convert(1, null, null, null),
				Is.EqualTo("D"));

			Assert.That(
				converter.Convert(null, null, null, null),
				Is.EqualTo(null));

			Assert.That(
				converter.Convert("BLA", null, null, null),
				Is.EqualTo("BLA"));
		}

		[Test]
		public void Test_Convert_String()
		{
			// :: Convert
			// 0..n          ...  Object at the Index position
			// Out-Of-Range  ...  DefaultValue

			var converter = new IndexToObjectConverter()
			{
				Values = new List<Object>(new[] { "A", "B", "C" }),
				DefaultValue = "D",
				DefaultIndex = -1,
			};

			Assert.That(
				converter.Convert(-1, null, null, null),
				Is.EqualTo("D"));

			Assert.That(
				converter.Convert(0, null, null, null),
				Is.EqualTo("A"));

			Assert.That(
				converter.Convert(1, null, null, null),
				Is.EqualTo("B"));

			Assert.That(
				converter.Convert(2, null, null, null),
				Is.EqualTo("C"));

			Assert.That(
				converter.Convert(3, null, null, null),
				Is.EqualTo("D"));

			Assert.That(
				converter.Convert(null, null, null, null),
				Is.EqualTo(null));

			Assert.That(
				converter.Convert("BLA", null, null, null),
				Is.EqualTo("BLA"));
		}

		[Test]
		public void Test_Convert_Int32()
		{
			// :: Convert
			// 0..n          ...  Object at the Index position
			// Out-Of-Range  ...  DefaultValue

			var converter = new IndexToObjectConverter()
			{
				Values = new List<Object>(new Object[] { 11, 22, 33 }),
				DefaultValue = 99,
				DefaultIndex = -1,
			};

			Assert.That(
				converter.Convert(-1, null, null, null),
				Is.EqualTo(99));

			Assert.That(
				converter.Convert(0, null, null, null),
				Is.EqualTo(11));

			Assert.That(
				converter.Convert(1, null, null, null),
				Is.EqualTo(22));

			Assert.That(
				converter.Convert(2, null, null, null),
				Is.EqualTo(33));

			Assert.That(
				converter.Convert(3, null, null, null),
				Is.EqualTo(99));

			Assert.That(
				converter.Convert(null, null, null, null),
				Is.EqualTo(null));

			Assert.That(
				converter.Convert("BLA", null, null, null),
				Is.EqualTo("BLA"));
		}


		[Test]
		public void Test_ConvertBack_DefaultValues()
		{
			// :: ConvertBack
			// equal to Object at Index position   ...  Index
			// not equal to any Object             ...  DependencyProperty.Unset

			var converter = new IndexToObjectConverter();

			Assert.That(
				converter.ConvertBack(null, null, null, null),
				Is.EqualTo(DependencyProperty.UnsetValue));

			Assert.That(
				converter.ConvertBack("", null, null, null),
				Is.EqualTo(DependencyProperty.UnsetValue));

			Assert.That(
				converter.ConvertBack(123, null, null, null),
				Is.EqualTo(DependencyProperty.UnsetValue));
		}

		[Test]
		public void Test_ConvertBack_NullList()
		{
			// :: ConvertBack
			// equal to Object at Index position   ...  Index
			// not equal to any Object             ...  DependencyProperty.Unset

			var converter = new IndexToObjectConverter()
			{
				Values = null,
				DefaultValue = "D",
				DefaultIndex = -1,
			};

			Assert.That(
				converter.ConvertBack("A", null, null, null),
				Is.EqualTo(-1));

			Assert.That(
				converter.ConvertBack("D", null, null, null),
				Is.EqualTo(-1));

			Assert.That(
				converter.ConvertBack("", null, null, null),
				Is.EqualTo(-1));

			Assert.That(
				converter.ConvertBack(123, null, null, null),
				Is.EqualTo(-1));
		}

		[Test]
		public void Test_ConvertBack_String()
		{
			// :: ConvertBack
			// equal to Object at Index position   ...  Index
			// not equal to any Object             ...  DependencyProperty.Unset

			var converter = new IndexToObjectConverter()
			{
				Values = new List<Object>(new[] { "A", "B", "C" }),
				DefaultValue = "D",
				DefaultIndex = -1,
			};

			Assert.That(
				converter.ConvertBack("A", null, null, null),
				Is.EqualTo(0));

			Assert.That(
				converter.ConvertBack("B", null, null, null),
				Is.EqualTo(1));

			Assert.That(
				converter.ConvertBack("C", null, null, null),
				Is.EqualTo(2));

			Assert.That(
				converter.ConvertBack("D", null, null, null),
				Is.EqualTo(-1));

			Assert.That(
				converter.ConvertBack("", null, null, null),
				Is.EqualTo(-1));

			Assert.That(
				converter.ConvertBack(123, null, null, null),
				Is.EqualTo(-1));
		}

		[Test]
		public void Test_ConvertBack_Int32()
		{
			// :: ConvertBack
			// equal to Object at Index position   ...  Index
			// not equal to any Object             ...  DependencyProperty.Unset

			var converter = new IndexToObjectConverter()
			{
				Values = new List<Object>(new Object[] { 11, 22, 33 }),
				DefaultValue = 99,
				DefaultIndex = -1,
			};

			Assert.That(
				converter.ConvertBack(11, null, null, null),
				Is.EqualTo(0));

			Assert.That(
				converter.ConvertBack(22, null, null, null),
				Is.EqualTo(1));

			Assert.That(
				converter.ConvertBack(null, null, null, null),
				Is.EqualTo(-1));

			Assert.That(
				converter.ConvertBack("", null, null, null),
				Is.EqualTo(-1));

			Assert.That(
				converter.ConvertBack(123, null, null, null),
				Is.EqualTo(-1));
		}

	}
}

#endif
